const kitty = {
  name: 'hello',
  value: 22
}

// 报错
// kitty = {
//   name: '22'
// }

kitty.name = 'Rory'


// 数组解构

// let input = [1, 2]
// let [first, second] = input
// console.log(first, second)

// let [first, ...rest] = [1, 2, 3, 4]
// console.log(first, rest)

// let [first] = [1, 2, 3, 4]
// console.log(first)

// let [, second, , fourth] = [1, 2, 3, 4]
// console.log(second)

// function f([first, second]: [number, number]) {
//   console.log(first, second)
// }

// f([1, 2])

// 对象解构
// let o = {
//   a: 'foo',
//   b: 12,
//   c: 'bar'
// }

// let { a, b } = o
// console.log(a, b)

// let { a, ...pass } = o
// let total = pass.b + pass.c.length
// console.log(total)

// 属性重命名
// let { a: newName1, b: newName2 } = o
// console.log(newName1, newName2)

// let { a, b }: { a: string, b: number } = o


// 默认值
// function keepWholeObject(wholeObject: { a: string, b?: number }) {
//   let { a, b = 1001 } = wholeObject
// }

// 展开
// let first = [1, 2]
// let second = [3, 4]
// let bothPlus = [0, ...first, ...second, 5]
// console.log(bothPlus) // [ 0, 1, 2, 3, 4, 5 ]

// let defaults = {
//   food: 'apple',
//   price: 13,
//   ambiance: 'noisy'
// }
// let search = { ...defaults, food: 'rich' }
// console.log(search) // { food: 'rich', price: 13, ambiance: 'noisy' }

// class C {
//   p = 12
//   m() {}
// }

// let c = new C()
// let clone = { ...c }
// console.log(clone.p)
// console.log(clone.m()) // 类型“{ p: number; }”上不存在属性“m”